home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CRYPTO / Des / des-how-to.txt < prev    next >
Internet Message Format  |  1995-03-09  |  12KB

  1. From news.shef.ac.uk!warwick!uknet!EU.net!howland.reston.ans.net!news2.near.net!news.mathworks.com!newshost.marcam.com!charnel.ecst.csuchico.edu!olivea!uunet!news.uiowa.edu!blue.weeg.uiowa.edu!blue.weeg.uiowa.edu!not-for-mail Mon Feb 27 11:51:47 1995
  2. Path: news.shef.ac.uk!warwick!uknet!EU.net!howland.reston.ans.net!news2.near.net!news.mathworks.com!newshost.marcam.com!charnel.ecst.csuchico.edu!olivea!uunet!news.uiowa.edu!blue.weeg.uiowa.edu!blue.weeg.uiowa.edu!not-for-mail
  3. From: mfischer@blue.weeg.uiowa.edu (Matthew Fischer)
  4. Newsgroups: sci.crypt
  5. Subject: DES How-to, version 1.2
  6. Date: 19 Feb 1995 23:02:23 -0600
  7. Organization: University of Iowa, Iowa City, IA, USA
  8. Lines: 285
  9. Distribution: usa,ca
  10. Message-ID: <3i97ov$646c@blue.weeg.uiowa.edu>
  11. NNTP-Posting-Host: blue.weeg.uiowa.edu
  12.  
  13. This is the latest version of my DES tutorial. I am posting it here (to 
  14. sci.crypt), because this is where I posted the original version (0), and 
  15. I have found that version archived at several sites (under the names 
  16. des-algorithm-details.txt and des_how_to_implement), and I want to make sure 
  17. everyone has access to the latest version. If you are archiving this 
  18. file, please let me know who you are, so I can get you the latest version 
  19. when I update. Also, please use the name "des-how-to.txt", because I like 
  20. it, and then it will be the same everywhere. (If you have a better idea 
  21. for a name, let me know.)
  22.  
  23.  
  24.                           How to implement the
  25.                      Data Encryption Standard (DES)
  26.  
  27.                         A step by step tutorial
  28.                               Version 1.2
  29.  
  30.  
  31. The Data Encryption Standard (DES) algorithm, adopted by the U.S. 
  32. government in 1977, is a block cipher that transforms 64-bit data blocks 
  33. under a 56-bit secret key, by means of permutation and substitution. It 
  34. is officially described in FIPS PUB 46. The DES algorithm is used for 
  35. many applications within the government and in the private sector.
  36.  
  37. This is a tutorial designed to be clear and compact, and to provide a
  38. newcomer to the DES with all the necessary information to implement it
  39. himself, without having to track down printed works or wade through C 
  40. source code. I welcome any comments.
  41.  Matthew Fischer <mfischer@heinous.isca.uiowa.edu>
  42.  
  43.  
  44. Here's how to do it, step by step:
  45.  
  46.  1  Process the key.
  47.  
  48.  1.1  Get a 64-bit key from the user. (Every 8th bit is considered a 
  49. parity bit. For a key to have correct parity, each byte should contain 
  50. an odd number of "1" bits.)
  51.  
  52.  1.2  Calculate the key schedule.
  53.  
  54.  1.2.1  Perform the following permutation on the 64-bit key. (The parity 
  55. bits are discarded, reducing the key to 56 bits. Bit 1 of the permuted 
  56. block is bit 57 of the original key, bit 2 is bit 49, and so on with bit 
  57. 56 being bit 4 of the original key.)
  58.  
  59.                         Permuted Choice 1 (PC-1)
  60.  
  61.                           57 49 41 33 25 17  9
  62.                            1 58 50 42 34 26 18
  63.                           10  2 59 51 43 35 27
  64.                           19 11  3 60 52 44 36
  65.                           63 55 47 39 31 23 15
  66.                            7 62 54 46 38 30 22
  67.                           14  6 61 53 45 37 29
  68.                           21 13  5 28 20 12  4
  69.  
  70.  1.2.2  Split the permuted key into two halves. The first 28 bits are 
  71. called C[0] and the last 28 bits are called D[0].
  72.  
  73.  1.2.3  Calculate the 16 subkeys. Start with i = 1.
  74.  
  75.  1.2.3.1  Perform one or two circular left shifts on both C[i-1] and 
  76. D[i-1] to get C[i] and D[i], respectively. The number of shifts per 
  77. iteration are given in the table below.
  78.  
  79.     Iteration #   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
  80.     Left Shifts   1  1  2  2  2  2  2  2  1  2  2  2  2  2  2  1
  81.  
  82.  1.2.3.2  Permute the concatenation C[i]D[i] as indicated below. This 
  83. will yield K[i], which is 48 bits long.
  84.  
  85.                         Permuted Choice 2 (PC-2)
  86.  
  87.                            14 17 11 24  1  5
  88.                             3 28 15  6 21 10
  89.                            23 19 12  4 26  8
  90.                            16  7 27 20 13  2
  91.                            41 52 31 37 47 55
  92.                            30 40 51 45 33 48
  93.                            44 49 39 56 34 53
  94.                            46 42 50 36 29 32
  95.  
  96.  1.2.3.3  Loop back to 1.2.3.1 until K[16] has been calculated.
  97.  
  98.  2  Process a 64-bit data block.
  99.  
  100.  2.1  Get a 64-bit data block. If the block is shorter than 64 bits, it 
  101. should be padded as appropriate for the application.
  102.  
  103.  2.2  Perform the following permutation on the data block.
  104.  
  105.                         Initial Permutation (IP)
  106.  
  107.                         58 50 42 34 26 18 10  2
  108.                         60 52 44 36 28 20 12  4
  109.                         62 54 46 38 30 22 14  6
  110.                         64 56 48 40 32 24 16  8
  111.                         57 49 41 33 25 17  9  1
  112.                         59 51 43 35 27 19 11  3
  113.                         61 53 45 37 29 21 13  5
  114.                         63 55 47 39 31 23 15  7
  115.  
  116.  2.3  Split the block into two halves. The first 32 bits are called L[0], 
  117. and the last 32 bits are called R[0].
  118.  
  119.  2.4  Apply the 16 subkeys to the data block. Start with i = 1.
  120.  
  121.  2.4.1  Expand the 32-bit R[i-1] into 48 bits according to the 
  122. bit-selection function below.
  123.  
  124.                              Expansion (E)
  125.  
  126.                            32  1  2  3  4  5
  127.                             4  5  6  7  8  9
  128.                             8  9 10 11 12 13
  129.                            12 13 14 15 16 17
  130.                            16 17 18 19 20 21
  131.                            20 21 22 23 24 25
  132.                            24 25 26 27 28 29
  133.                            28 29 30 31 32  1
  134.  
  135.  2.4.2  Exclusive-or E(R[i-1]) with K[i].
  136.  
  137.  2.4.3  Break E(R[i-1]) xor K[i] into eight 6-bit blocks. Bits 1-6 are 
  138. B[1], bits 7-12 are B[2], and so on with bits 43-48 being B[8].
  139.  
  140.  2.4.4  Substitute the values found in the S-boxes for all B[j]. Start 
  141. with j = 1. All values in the S-boxes should be considered 4 bits wide.
  142.  
  143.  2.4.4.1  Take the 1st and 6th bits of B[j] together as a 2-bit value  
  144. (call it m) indicating the row in S[j] to look in for the substitution.
  145.  
  146.  2.4.4.2  Take the 2nd through 5th bits of B[j] together as a 4-bit
  147. value (call it n) indicating the column in S[j] to find the substitution.
  148.  
  149.  2.4.4.3  Replace B[j] with S[j][m][n].
  150.  
  151.                        Substitution Box 1 (S[1])
  152.  
  153.             14  4 13  1  2 15 11  8  3 10  6 12  5  9  0  7
  154.              0 15  7  4 14  2 13  1 10  6 12 11  9  5  3  8
  155.              4  1 14  8 13  6  2 11 15 12  9  7  3 10  5  0
  156.             15 12  8  2  4  9  1  7  5 11  3 14 10  0  6 13
  157.  
  158.                                   S[2]
  159.  
  160.             15  1  8 14  6 11  3  4  9  7  2 13 12  0  5 10
  161.              3 13  4  7 15  2  8 14 12  0  1 10  6  9 11  5
  162.              0 14  7 11 10  4 13  1  5  8 12  6  9  3  2 15
  163.             13  8 10  1  3 15  4  2 11  6  7 12  0  5 14  9
  164.  
  165.                                   S[3]
  166.  
  167.             10  0  9 14  6  3 15  5  1 13 12  7 11  4  2  8
  168.             13  7  0  9  3  4  6 10  2  8  5 14 12 11 15  1
  169.             13  6  4  9  8 15  3  0 11  1  2 12  5 10 14  7
  170.              1 10 13  0  6  9  8  7  4 15 14  3 11  5  2 12
  171.  
  172.                                   S[4]
  173.  
  174.              7 13 14  3  0  6  9 10  1  2  8  5 11 12  4 15
  175.             13  8 11  5  6 15  0  3  4  7  2 12  1 10 14  9
  176.             10  6  9  0 12 11  7 13 15  1  3 14  5  2  8  4
  177.              3 15  0  6 10  1 13  8  9  4  5 11 12  7  2 14
  178.  
  179.                                   S[5]
  180.  
  181.              2 12  4  1  7 10 11  6  8  5  3 15 13  0 14  9
  182.             14 11  2 12  4  7 13  1  5  0 15 10  3  9  8  6
  183.              4  2  1 11 10 13  7  8 15  9 12  5  6  3  0 14
  184.             11  8 12  7  1 14  2 13  6 15  0  9 10  4  5  3
  185.  
  186.                                   S[6]
  187.  
  188.             12  1 10 15  9  2  6  8  0 13  3  4 14  7  5 11
  189.             10 15  4  2  7 12  9  5  6  1 13 14  0 11  3  8
  190.              9 14 15  5  2  8 12  3  7  0  4 10  1 13 11  6
  191.              4  3  2 12  9  5 15 10 11 14  1  7  6  0  8 13
  192.  
  193.                                   S[7]
  194.  
  195.              4 11  2 14 15  0  8 13  3 12  9  7  5 10  6  1
  196.             13  0 11  7  4  9  1 10 14  3  5 12  2 15  8  6
  197.              1  4 11 13 12  3  7 14 10 15  6  8  0  5  9  2
  198.              6 11 13  8  1  4 10  7  9  5  0 15 14  2  3 12
  199.  
  200.                                   S[8]
  201.  
  202.             13  2  8  4  6 15 11  1 10  9  3 14  5  0 12  7
  203.              1 15 13  8 10  3  7  4 12  5  6 11  0 14  9  2
  204.              7 11  4  1  9 12 14  2  0  6 10 13 15  3  5  8
  205.              2  1 14  7  4 10  8 13 15 12  9  0  3  5  6 11
  206.  
  207.  2.4.4.4  Loop back to 2.4.4.1 until all 8 blocks have been replaced.
  208.  
  209.  2.4.5  Permute the concatenation of B[1] through B[8] as indicated below.
  210.  
  211.                              Permutation P
  212.  
  213.                               16  7 20 21
  214.                               29 12 28 17
  215.                                1 15 23 26
  216.                                5 18 31 10
  217.                                2  8 24 14
  218.                               32 27  3  9
  219.                               19 13 30  6
  220.                               22 11  4 25
  221.  
  222.  2.4.6  Exclusive-or the resulting value with L[i-1]. Thus, all together, 
  223. your R[i] = L[i-1] xor P(S[1](B[1])...S[8](B[8])), where B[j] is a 6-bit  
  224. block of E(R[i-1]) xor K[i]. (The function for R[i] is written as, R[i] = 
  225. L[i-1] xor f(R[i-1], K[i]).)
  226.  
  227.  2.4.7  L[i] = R[i-1].
  228.  
  229.  2.4.8  Loop back to 2.4.1 until K[16] has been applied.
  230.  
  231.  2.5  Perform the following permutation on the block R[16]L[16].
  232.  
  233.                        Final Permutation (IP**-1)
  234.  
  235.                         40  8 48 16 56 24 64 32
  236.                         39  7 47 15 55 23 63 31
  237.                         38  6 46 14 54 22 62 30
  238.                         37  5 45 13 53 21 61 29
  239.                         36  4 44 12 52 20 60 28
  240.                         35  3 43 11 51 19 59 27
  241.                         34  2 42 10 50 18 58 26
  242.                         33  1 41  9 49 17 57 25
  243.  
  244.  
  245. This has been a description of how to use the DES algorithm to encrypt 
  246. one 64-bit block. To decrypt, use the same process, but just use the keys 
  247. K[i] in reverse order. That is, instead of applying K[1] for the first 
  248. iteration, apply K[16], and then K[15] for the second, on down to K[1].
  249.  
  250. Summaries:
  251.  
  252.  Key schedule:
  253.   C[0]D[0] = PC1(key)
  254.   for 1 <= i <= 16
  255.    C[i] = LS[i](C[i-1])
  256.    D[i] = LS[i](D[i-1])
  257.    K[i] = PC2(C[i]D[i])
  258.  
  259.  Encipherment:
  260.   L[0]R[0] = IP(plain block)
  261.   for 1 <= i <= 16
  262.    L[i] = R[i-1]
  263.    R[i] = L[i-1] xor f(R[i-1], K[i])
  264.   cipher block = FP(R[16]L[16])
  265.  
  266.  Decipherment:
  267.   R[16]L[16] = IP(cipher block)
  268.   for 1 <= i <= 16
  269.    R[i-1] = L[i]
  270.    L[i-1] = R[i] xor f(L[i], K[i])
  271.   plain block = FP(L[0]R[0])
  272.  
  273.  
  274. To encrypt or decrypt more than 64 bits there are four official modes 
  275. (defined in FIPS PUB 81). One is to go through the above-described 
  276. process for each block in succession. This is called Electronic Codebook 
  277. (ECB) mode. A stronger method is to exclusive-or each plaintext block 
  278. with the preceding ciphertext block prior to encryption. (The first 
  279. block is exclusive-or'ed with a secret 64-bit initialization vector 
  280. (IV).) This is called Cipher Block Chaining (CBC) mode. The other two 
  281. modes are Output Feedback (OFB) and Cipher Feedback (CFB).
  282.  
  283. When it comes to padding the data block, there are several options. One 
  284. is to simply append zeros. Two suggested by FIPS PUB 81 are, if the data 
  285. is binary data, fill up the block with bits that are the opposite of the 
  286. last bit of data, or, if the data is ASCII data, fill up the block with 
  287. random bytes and put the ASCII character for the number of pad bytes in 
  288. the last byte of the block. Another technique is to pad the block with 
  289. random bytes and in the last 3 bits store the original number of data bytes.
  290.  
  291. The DES algorithm can also be used to calculate checksums up to 64 bits 
  292. long (see FIPS PUB 113). If the number of data bits to be checksummed is 
  293. not a multiple of 64, the last data block should be padded with zeros. If 
  294. the data is ASCII data, the first bit of each byte should be set to 0. 
  295. The data is then encrypted in CBC mode with IV = 0. The leftmost n bits 
  296. (where 16 <= n <= 64, and n is a multiple of 8) of the final ciphertext 
  297. block are an n-bit checksum.
  298.  
  299.